package stack;

import java.util.Stack;

public class MinStack<T extends Comparable<T>> {

    private final Stack<T> stack = new Stack<>();

    private final Stack<T> minStack = new Stack<>();

    public T push(T t) {
        stack.push(t);

        if (minStack.isEmpty()) {

            minStack.push(t);
        } else {
            T peek = minStack.peek();
            if (t.compareTo(peek) <= 0) {
                minStack.push(t);
            }
        }
        return t;
    }

    /**
     * 因为 minStack中存在的元素都是从栈低到栈顶逐渐变小的，
     * minStack 中栈顶的元素既是 minStack中最小的，也是 stack 中最小的
     * 所以不会存在 stack 中的元素比 minStack 中的栈顶元素还要小的情况
     *
     *
     * @return
     */
    public T pop() {
        T pop = stack.pop();

        if(pop.compareTo(minStack.peek())==0){
            /*
             * 当 stack中弹出的元素和minStack中的元素一致时，
             * 应该删除 minStack中的元素
             */
            minStack.pop();
        }
        return pop;
    }

    public T peekMin(){
        return minStack.peek();
    }
}
